import PackV1 from "../../base/net/chatpackv1.js"
//import * as bfun from "../../core/bfun.js"
import * as fun from "../../core/fun.js"
const 默认服务器地址 = 'ws://127.0.0.1:3000/';
let wsframework = {
	newCreate(url) {
		/**
		 * 必须使用f接收委托= 自定义函数(res)
		 * 才能工作
		 */
		let self = {}
		//消息缓存
		let sendQueue = [];
		let socketOpen = false;
		self.f接收委托 = null;
		self.token=null;
		let _socket = null;
		self.send = function(pack) {
			if (socketOpen) {
				_socket.send({
					data: pack
				});
			} else {
				sendQueue.push(pack);
			}
		};
		/**
		 * @param {Object} packv1
		 */
		self.sendObject = function(packv1) {
			if (packv1) {
				let pack = PackV1.serial(packv1)
				self.send(pack);
			}
		};
		self.sendString = function(类型, 数据) {
			let pv = new PackV1();
			pv.指令 = 类型;
			if (数据) pv.指令参数 = 数据
			let pack = PackV1.serial(pv)
			self.send(pack);
		};	
		self.sendBuffer = function(类型, 参数, 二进制流) {
			let pv = new PackV1();
			pv.指令 = 类型;
			if (参数) pv.指令参数 = JSON.stringify(参数)
			if (二进制流) pv.字节数据 = 二进制流
			let pack = PackV1.serial(pv)
			self.send(pack);
		};
		self.sendJSON = function(类型, 参数) {
			let pv = new PackV1();
			pv.指令 = 类型;
			if (参数) pv.指令参数 = JSON.stringify(参数)
			let pack = PackV1.serial(pv)
			self.send(pack);
		};
		self.close = function() {
			_socket.close({
				code: 1000
			});
		};
		/*
		 * @param {SocketTask} 
		 */
		if (_socket != null) return;
		try {
			_socket = uni.connectSocket({
				url: url || 默认服务器地址,
				success(e) {
					console.log("连接 ws 服务端", JSON.stringify(e));
				}
			});
			//socket.send()
			// uni.onSocketOpen(function(res) {
			// 	console.log('WebSocket连接已打开！', res);
			// });
			_socket.onOpen(function(cli) {
				socketOpen = true;
				for (var i = 0; i < sendQueue.length; i++) {
					_socket.send({
						data: sendQueue[i]
					});
				}
				sendQueue = [];
				console.log("实例化 ws 对象完成.");
			});

			_socket.onError(function(res) {
				console.log('WebSocket连接打开失败，请检查！', JSON.stringify(res));
			});

			//uni.onSocketMessage(function(res) {这种写法最大的问题是 只对当前的socket有效,
			_socket.onMessage(function(res) {
				if (!self.token) {
					self.token=	res.data;
					console.log("res.data",res.data)
					return;
				}
				if (self.f接收委托) {
					//string 可以是文本也可以是jsonstring
					if (fun._IS.isString(res.data)) {
						console.log('收到服务器内容1111：', Object.prototype.toString.call(res.data), res.data);
						self.f接收委托(res.data);
					} else { // isbuffer 二进制 自定义协议 PackV1
						let data = new Uint8Array(res.data);
						let obj = PackV1.deserial(data);
						//let obj2=bfun.bytes2Json(data);
						//console.log('收到服务器内容222222222：', res);
						self.f接收委托(obj);
					}
				}
			})

			_socket.onClose(function(res) {
				console.log('WebSocket 已关闭！', res);
				_socket = null;
			});

		} catch (err) {
			console.log("创建 ws 异常", err)
		}
		return self;
	}
}

export default wsframework;
